#include <stdio.h>

#define MaxSize 5
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize]; //数组
    int top;   //始终指向栈顶的一个变量
    int front,rear;  //队列头，队列尾
}SqStack,SqQueue;

void InitQueue(SqQueue &Q)
{
    Q.rear=Q.front=0;
}
bool EnQueue(SqQueue &Q,ElemType x)
{
    if((Q.rear+1)%MaxSize==Q.front)
    {
        return false;
    }
    Q.data[Q.rear]=x;  //放入元素,尾部入队
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}
bool DeQueue(SqQueue &Q,ElemType &x)
{
    if(Q.front==Q.rear)
    {
        return false;
    }
    x=Q.data[Q.front]; //出队列，头部出队
    Q.front=(Q.front+1)%MaxSize;
    return true;
}


void InitStack(SqStack &S)
{
    S.top=-1;
}
bool Push(SqStack &S,ElemType x)
{
    if(S.top==MaxSize-1)
    {
        return false;
    }
    S.data[++S.top]=x;
    return true;
}
bool Pop(SqStack &S,ElemType &x)
{
    if(S.top==-1)
    {
        return false;
    }
    x=S.data[S.top--];
    return true;
}
int main() {
    //栈
    SqStack S;
    InitStack(S);
    ElemType element;
    //入栈
    for (int i = 0; i < 3; i++) {
        scanf("%d",&element);
        Push(S,element);
    }
    //出栈
    for (int i = 0; i < 3; i++) {
        Pop(S,element);
        printf("%2d",element);
    }
    printf("\n");

    //循环队列
    SqQueue Q;
    bool ret;
    InitQueue(Q);
    //入队
    for (int i = 0; i < 5; i++)
    {
        scanf("%d",&element);
        ret=EnQueue(Q,element);
        if(ret==false)
        {
            printf("false\n");
        }
    }
    // 出队
    for (int i = 0; i < 5; i++)
    {
        ret=DeQueue(Q,element);
        if(ret)
        {
            printf("%2d",element);
        }
    }

    return 0;
}
